package reviewd

import (
	"time"

	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/common"
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/ddd"
)

const (
	// TargetTypeInfo 信息
	TargetTypeInfo int = iota + 1
	// TargetTypeReply 评论
	TargetTypeReply
)

var (
	_ ReviewAggregateRoot = &reviewAggregateRoot{}
)

// ReviewSearch 查询条件
type ReviewSearch struct {
	TargetType int    // 审核目标类型 1 信息 2 评论
	TargetID   string // 审核目标编号
}

// ReviewDesc Review描述实例
type ReviewDesc struct {
	TargetType int       `json:"target_type"` // 审核目标类型 1 信息 2 评论
	TargetID   string    `json:"target_id"`   // 审核目标编号
	Reviewer   string    `json:"reviewer"`    // 审核人
	Reason     string    `json:"reason"`      // 审核理由
	Result     bool      `json:"result"`      // 审核结果
	ReviewTime time.Time `json:"review_time"` // 审核时间
}

func initReview(d ddd.Domain, repo ReviewRepo) {
	ar := &reviewAggregateRoot{}
	ar.Init(ar, d, Review)
	repo.Init(repo, ar, Review)
}

// ReviewAggregateRoot 审核的聚合根
type ReviewAggregateRoot interface {
	ddd.AggregateRoot
	// 新增审核
	AddReview(ctx ddd.Context, review ReviewDesc) (id string, err error)
	// 删除
	DeleteReview(ctx ddd.Context, reviewID string) (err error)
	// 获取指定审核：根据唯一标识获取审核实体
	GetReview(ctx ddd.Context, id string) (ia *ReviewAggregate, err error)
	// 分页获取审核列表：根据唯一标识获取下一页指定数量的审核实体集合
	// total 总数量
	QueryPage(ctx ddd.Context, is ReviewSearch, pi common.PageInfo) (npi common.PageResult, result []ReviewAggregate, err error)
	// 查询所有符合条件的审核信息
	QueryAll(ctx ddd.Context, is ReviewSearch) (result []ReviewAggregate, err error)
}

// ReviewRepo 审核仓储
type ReviewRepo interface {
	ddd.Repository
	// 新增审核
	AddReview(ctx ddd.Context, review ReviewDesc) (id string, err error)
	// 获取指定审核：根据唯一标识获取审核实体
	GetReview(ctx ddd.Context, reviewid string) (*ReviewAggregate, error)
	// 分页获取审核列表：根据唯一标识获取下一页指定数量的审核实体集合
	// total 总数量
	QueryPage(ctx ddd.Context, is ReviewSearch, pi common.PageInfo) (npi common.PageResult, result []ReviewAggregate, err error)
	// 查询所有符合条件的审核信息
	QueryAll(ctx ddd.Context, is ReviewSearch) (result []ReviewAggregate, err error)
	// 删除审核信息
	DeleteReview(ctx ddd.Context, reviewID string) (err error)
}

// ReviewAggregate 审核聚合
type ReviewAggregate struct {
	ddd.BaseAggregate
	ReviewID   string `json:"review_id"`
	ReviewDesc `json:"review_desc"`
}

// Repo 获取聚合根对应的仓储
func (r *ReviewAggregate) Repo() ReviewRepo {
	return r.Repository().(ReviewRepo)
}

type reviewAggregateRoot struct {
	ddd.BaseAggregateRoot
}

func (r *reviewAggregateRoot) Repo() ReviewRepo {
	return r.Repository().(ReviewRepo)
}
func (r *reviewAggregateRoot) AddReview(ctx ddd.Context, review ReviewDesc) (id string, err error) {
	return r.Repo().AddReview(ctx, review)
}
func (r *reviewAggregateRoot) GetReview(ctx ddd.Context, id string) (ia *ReviewAggregate, err error) {
	return r.Repo().GetReview(ctx, id)
}

// 分页获取审核列表：根据唯一标识获取下一页指定数量的审核实体集合
// total 总数量
func (r *reviewAggregateRoot) QueryPage(ctx ddd.Context, is ReviewSearch, pi common.PageInfo) (common.PageResult, []ReviewAggregate, error) {
	return r.Repo().QueryPage(ctx, is, pi)
}

// 查询所有符合条件的审核信息
func (r *reviewAggregateRoot) QueryAll(ctx ddd.Context, is ReviewSearch) (result []ReviewAggregate, err error) {
	return r.Repo().QueryAll(ctx, is)
}

// 删除
func (r *reviewAggregateRoot) DeleteReview(ctx ddd.Context, reviewID string) (err error) {
	return r.Repo().DeleteReview(ctx, reviewID)
}
